home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 8 / The Arsenal Files Collection #8 (Arsenal Computer) (1996).ISO / g_quake / dmmde321.zip / DOG.QC < prev    next >
Text File  |  1996-08-16  |  11KB  |  408 lines

  1. /*
  2. ==============================================================================
  3.  
  4. DOG
  5.  
  6. ==============================================================================
  7. */
  8. $cd /raid/quake/id1/models/dog
  9. $origin 0 0 24
  10. $base base
  11. $skin skin
  12.  
  13. $frame attack1 attack2 attack3 attack4 attack5 attack6 attack7 attack8
  14.  
  15. $frame death1 death2 death3 death4 death5 death6 death7 death8 death9
  16.  
  17. $frame deathb1 deathb2 deathb3 deathb4 deathb5 deathb6 deathb7 deathb8
  18. $frame deathb9
  19.  
  20. $frame pain1 pain2 pain3 pain4 pain5 pain6
  21.  
  22. $frame painb1 painb2 painb3 painb4 painb5 painb6 painb7 painb8 painb9 painb10
  23. $frame painb11 painb12 painb13 painb14 painb15 painb16
  24.  
  25. $frame run1 run2 run3 run4 run5 run6 run7 run8 run9 run10 run11 run12
  26.  
  27. $frame leap1 leap2 leap3 leap4 leap5 leap6 leap7 leap8 leap9
  28.  
  29. $frame stand1 stand2 stand3 stand4 stand5 stand6 stand7 stand8 stand9
  30.  
  31. $frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 walk8
  32.  
  33.  
  34. void() dog_leap1;
  35. void() dog_run1;
  36. void() dog_respawn;
  37.  
  38. /*
  39. ================
  40. dog_bite
  41.  
  42. ================
  43. */
  44. void() dog_bite =
  45. {
  46. local vector    delta;
  47. local float     ldmg;
  48.  
  49.     if (!self.enemy)
  50.         return;
  51.  
  52.     ai_charge(10);
  53.  
  54.     if (!CanDamage (self.enemy, self))
  55.         return;
  56.  
  57.     delta = self.enemy.origin - self.origin;
  58.  
  59.     if (vlen(delta) > 100)
  60.         return;
  61.         
  62.     ldmg = (random() + random() + random()) * 8;
  63.     T_Damage (self.enemy, self, self, ldmg);
  64. };
  65.  
  66. void()    Dog_JumpTouch =
  67. {
  68.     local    float    ldmg;
  69.  
  70.     if (self.health <= 0)
  71.         return;
  72.         
  73.     if (other.takedamage)
  74.     {
  75.         if ( vlen(self.velocity) > 300 )
  76.         {
  77.             ldmg = 10 + 10*random();
  78.             T_Damage (other, self, self, ldmg);    
  79.         }
  80.     }
  81.  
  82.     if (!checkbottom(self))
  83.     {
  84.         if (self.flags & FL_ONGROUND)
  85.         {    // jump randomly to not get hung up
  86. //dprint ("popjump\n");
  87.     self.touch = SUB_Null;
  88.     self.think = dog_leap1;
  89.     self.nextthink = time + 0.1;
  90.  
  91. //            self.velocity_x = (random() - 0.5) * 600;
  92. //            self.velocity_y = (random() - 0.5) * 600;
  93. //            self.velocity_z = 200;
  94. //            self.flags = self.flags - FL_ONGROUND;
  95.         }
  96.         return;    // not on ground yet
  97.     }
  98.  
  99.     self.touch = SUB_Null;
  100.     self.think = dog_run1;
  101.     self.nextthink = time + 0.1;
  102. };
  103.  
  104.  
  105. void() dog_stand1    =[    $stand1,    dog_stand2    ] {ai_stand();};
  106. void() dog_stand2    =[    $stand2,    dog_stand3    ] {ai_stand();};
  107. void() dog_stand3    =[    $stand3,    dog_stand4    ] {ai_stand();};
  108. void() dog_stand4    =[    $stand4,    dog_stand5    ] {ai_stand();};
  109. void() dog_stand5    =[    $stand5,    dog_stand6    ] {ai_stand();};
  110. void() dog_stand6    =[    $stand6,    dog_stand7    ] {ai_stand();};
  111. void() dog_stand7    =[    $stand7,    dog_stand8    ] {ai_stand();};
  112. void() dog_stand8    =[    $stand8,    dog_stand9    ] {ai_stand();};
  113. void() dog_stand9    =[    $stand9,    dog_stand1    ] {ai_stand();};
  114.  
  115. void() dog_walk1    =[    $walk1 ,    dog_walk2    ] {
  116. if (random() < 0.2)
  117.     sound (self, CHAN_VOICE, "dog/idle.wav", 1, ATTN_IDLE);
  118. ai_walk(8);};
  119. void() dog_walk2    =[    $walk2 ,    dog_walk3    ] {ai_walk(8);};
  120. void() dog_walk3    =[    $walk3 ,    dog_walk4    ] {ai_walk(8);};
  121. void() dog_walk4    =[    $walk4 ,    dog_walk5    ] {ai_walk(8);};
  122. void() dog_walk5    =[    $walk5 ,    dog_walk6    ] {ai_walk(8);};
  123. void() dog_walk6    =[    $walk6 ,    dog_walk7    ] {ai_walk(8);};
  124. void() dog_walk7    =[    $walk7 ,    dog_walk8    ] {ai_walk(8);};
  125. void() dog_walk8    =[    $walk8 ,    dog_walk1    ] {ai_walk(8);};
  126.  
  127. void() dog_run1        =[    $run1  ,    dog_run2    ] {
  128. if (random() < 0.2)
  129.     sound (self, CHAN_VOICE, "dog/idle.wav", 1, ATTN_IDLE);
  130. ai_run(16);};
  131. void() dog_run2        =[    $run2  ,    dog_run3    ] {ai_run(32);};
  132. void() dog_run3        =[    $run3  ,    dog_run4    ] {ai_run(32);};
  133. void() dog_run4        =[    $run4  ,    dog_run5    ] {ai_run(20);};
  134. void() dog_run5        =[    $run5  ,    dog_run6    ] {ai_run(64);};
  135. void() dog_run6        =[    $run6  ,    dog_run7    ] {ai_run(32);};
  136. void() dog_run7        =[    $run7  ,    dog_run8    ] {ai_run(16);};
  137. void() dog_run8        =[    $run8  ,    dog_run9    ] {ai_run(32);};
  138. void() dog_run9        =[    $run9  ,    dog_run10    ] {ai_run(32);};
  139. void() dog_run10    =[    $run10  ,    dog_run11    ] {ai_run(20);};
  140. void() dog_run11    =[    $run11  ,    dog_run12    ] {ai_run(64);};
  141. void() dog_run12    =[    $run12  ,    dog_run1    ] {ai_run(32);};
  142.  
  143. void() dog_atta1    =[    $attack1,    dog_atta2    ] {ai_charge(10);};
  144. void() dog_atta2    =[    $attack2,    dog_atta3    ] {ai_charge(10);};
  145. void() dog_atta3    =[    $attack3,    dog_atta4    ] {ai_charge(10);};
  146. void() dog_atta4    =[    $attack4,    dog_atta5    ] {
  147. sound (self, CHAN_VOICE, "dog/dattack1.wav", 1, ATTN_NORM);
  148. dog_bite();};
  149. void() dog_atta5    =[    $attack5,    dog_atta6    ] {ai_charge(10);};
  150. void() dog_atta6    =[    $attack6,    dog_atta7    ] {ai_charge(10);};
  151. void() dog_atta7    =[    $attack7,    dog_atta8    ] {ai_charge(10);};
  152. void() dog_atta8    =[    $attack8,    dog_run1    ] {ai_charge(10);};
  153.  
  154. void() dog_leap1    =[    $leap1,        dog_leap2    ] {ai_face();};
  155. void() dog_leap2    =[    $leap2,        dog_leap3    ]
  156. {
  157.     ai_face();
  158.     
  159.     self.touch = Dog_JumpTouch;
  160.     makevectors (self.angles);
  161.     self.origin_z = self.origin_z + 1;
  162.     self.velocity = v_forward * 300 + '0 0 200';
  163.     if (self.flags & FL_ONGROUND)
  164.         self.flags = self.flags - FL_ONGROUND;
  165. };
  166.  
  167. void() dog_leap3    =[    $leap3,        dog_leap4    ] {};
  168. void() dog_leap4    =[    $leap4,        dog_leap5    ] {};
  169. void() dog_leap5    =[    $leap5,        dog_leap6    ] {};
  170. void() dog_leap6    =[    $leap6,        dog_leap7    ] {};
  171. void() dog_leap7    =[    $leap7,        dog_leap8    ] {};
  172. void() dog_leap8    =[    $leap8,        dog_leap9    ] {};
  173. void() dog_leap9    =[    $leap9,        dog_leap9    ] {};
  174.  
  175. void() dog_pain1    =[    $pain1 ,    dog_pain2    ] {};
  176. void() dog_pain2    =[    $pain2 ,    dog_pain3    ] {};
  177. void() dog_pain3    =[    $pain3 ,    dog_pain4    ] {};
  178. void() dog_pain4    =[    $pain4 ,    dog_pain5    ] {};
  179. void() dog_pain5    =[    $pain5 ,    dog_pain6    ] {};
  180. void() dog_pain6    =[    $pain6 ,    dog_run1    ] {};
  181.  
  182. void() dog_painb1    =[    $painb1 ,    dog_painb2    ] {};
  183. void() dog_painb2    =[    $painb2 ,    dog_painb3    ] {};
  184. void() dog_painb3    =[    $painb3 ,    dog_painb4    ] {ai_pain(4);};
  185. void() dog_painb4    =[    $painb4 ,    dog_painb5    ] {ai_pain(12);};
  186. void() dog_painb5    =[    $painb5 ,    dog_painb6    ] {ai_pain(12);};
  187. void() dog_painb6    =[    $painb6 ,    dog_painb7    ] {ai_pain(2);};
  188. void() dog_painb7    =[    $painb7 ,    dog_painb8    ] {};
  189. void() dog_painb8    =[    $painb8 ,    dog_painb9    ] {ai_pain(4);};
  190. void() dog_painb9    =[    $painb9 ,    dog_painb10    ] {};
  191. void() dog_painb10    =[    $painb10 ,    dog_painb11    ] {ai_pain(10);};
  192. void() dog_painb11    =[    $painb11 ,    dog_painb12    ] {};
  193. void() dog_painb12    =[    $painb12 ,    dog_painb13    ] {};
  194. void() dog_painb13    =[    $painb13 ,    dog_painb14    ] {};
  195. void() dog_painb14    =[    $painb14 ,    dog_painb15    ] {};
  196. void() dog_painb15    =[    $painb15 ,    dog_painb16    ] {};
  197. void() dog_painb16    =[    $painb16 ,    dog_run1    ] {};
  198.  
  199. void() dog_pain =
  200. {
  201.     sound (self, CHAN_VOICE, "dog/dpain1.wav", 1, ATTN_NORM);
  202.  
  203.     if (random() > 0.5)
  204.         dog_pain1 ();
  205.     else
  206.         dog_painb1 ();
  207. };
  208.  
  209. void() dog_die1        =[    $death1,    dog_die2    ] {};
  210. void() dog_die2        =[    $death2,    dog_die3    ] {};
  211. void() dog_die3        =[    $death3,    dog_die4    ] {};
  212. void() dog_die4        =[    $death4,    dog_die5    ] {};
  213. void() dog_die5        =[    $death5,    dog_die6    ] {};
  214. void() dog_die6        =[    $death6,    dog_die7    ] {};
  215. void() dog_die7        =[    $death7,    dog_die8    ] {};
  216. void() dog_die8        =[    $death8,    dog_die9    ] {};
  217. void() dog_die9        =[    $death9,    dog_die9    ] {
  218.         if (deathmatch > 4)
  219.         {
  220.                 self.think = dog_respawn;
  221.                 self.nextthink = time + 30;
  222.         }
  223. };
  224.  
  225. void() dog_dieb1        =[    $deathb1,    dog_dieb2    ] {};
  226. void() dog_dieb2        =[    $deathb2,    dog_dieb3    ] {};
  227. void() dog_dieb3        =[    $deathb3,    dog_dieb4    ] {};
  228. void() dog_dieb4        =[    $deathb4,    dog_dieb5    ] {};
  229. void() dog_dieb5        =[    $deathb5,    dog_dieb6    ] {};
  230. void() dog_dieb6        =[    $deathb6,    dog_dieb7    ] {};
  231. void() dog_dieb7        =[    $deathb7,    dog_dieb8    ] {};
  232. void() dog_dieb8        =[    $deathb8,    dog_dieb9    ] {};
  233. void() dog_dieb9        =[    $deathb9,    dog_dieb9    ] {
  234.         if (deathmatch > 4)
  235.         {
  236.                 self.think = dog_respawn;
  237.                 self.nextthink = time + 30;
  238.         }
  239. };
  240.  
  241.  
  242. void() dog_die =
  243. {
  244. // check for gib
  245.     if (self.health < -35)
  246.     {
  247.         sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM);
  248.         ThrowGib ("progs/gib3.mdl", self.health);
  249.         ThrowGib ("progs/gib3.mdl", self.health);
  250.         ThrowGib ("progs/gib3.mdl", self.health);
  251.         ThrowHead ("progs/h_dog.mdl", self.health);
  252.  
  253.                 if ((deathmatch == 6) || (deathmatch == 7))
  254.                 {
  255.                         self.think = dog_respawn;
  256.                         self.nextthink = time + 30;
  257.                 }
  258.  
  259.         return;
  260.     }
  261.  
  262. // regular death
  263.     sound (self, CHAN_VOICE, "dog/ddeath.wav", 1, ATTN_NORM);
  264.         self.solid = SOLID_NOT;
  265.  
  266.     if (random() > 0.5)
  267.         dog_die1 ();
  268.     else
  269.         dog_dieb1 ();
  270.  
  271. };
  272.  
  273. //============================================================================
  274.  
  275. /*
  276. ==============
  277. CheckDogMelee
  278.  
  279. Returns TRUE if a melee attack would hit right now
  280. ==============
  281. */
  282. float()    CheckDogMelee =
  283. {
  284.     if (enemy_range == RANGE_MELEE)
  285.     {    // FIXME: check canreach
  286.         self.attack_state = AS_MELEE;
  287.         return TRUE;
  288.     }
  289.     return FALSE;
  290. };
  291.  
  292. /*
  293. ==============
  294. CheckDogJump
  295.  
  296. ==============
  297. */
  298. float()    CheckDogJump =
  299. {
  300.     local    vector    dist;
  301.     local    float    d;
  302.  
  303.     if (self.origin_z + self.mins_z > self.enemy.origin_z + self.enemy.mins_z
  304.     + 0.75 * self.enemy.size_z)
  305.         return FALSE;
  306.         
  307.     if (self.origin_z + self.maxs_z < self.enemy.origin_z + self.enemy.mins_z
  308.     + 0.25 * self.enemy.size_z)
  309.         return FALSE;
  310.         
  311.     dist = self.enemy.origin - self.origin;
  312.     dist_z = 0;
  313.     
  314.     d = vlen(dist);
  315.     
  316.     if (d < 80)
  317.         return FALSE;
  318.         
  319.     if (d > 150)
  320.         return FALSE;
  321.         
  322.     return TRUE;
  323. };
  324.  
  325. float()    DogCheckAttack =
  326. {
  327.     local    vector    vec;
  328.     
  329. // if close enough for slashing, go for it
  330.     if (CheckDogMelee ())
  331.     {
  332.         self.attack_state = AS_MELEE;
  333.         return TRUE;
  334.     }
  335.     
  336.     if (CheckDogJump ())
  337.     {
  338.         self.attack_state = AS_MISSILE;
  339.         return TRUE;
  340.     }
  341.     
  342.     return FALSE;
  343. };
  344.  
  345.  
  346. //===========================================================================
  347.  
  348. /*QUAKED monster_dog (1 0 0) (-32 -32 -24) (32 32 40) Ambush
  349.  
  350. */
  351. void() monster_dog =
  352. {
  353.         if ((deathmatch) && (deathmatch < 4))
  354.     {
  355.         remove(self);
  356.         return;
  357.     }
  358.     precache_model ("progs/h_dog.mdl");
  359.     precache_model ("progs/dog.mdl");
  360.  
  361.     precache_sound ("dog/dattack1.wav");
  362.     precache_sound ("dog/ddeath.wav");
  363.     precache_sound ("dog/dpain1.wav");
  364.     precache_sound ("dog/dsight.wav");
  365.     precache_sound ("dog/idle.wav");
  366.  
  367.     self.solid = SOLID_SLIDEBOX;
  368.     self.movetype = MOVETYPE_STEP;
  369.  
  370.     setmodel (self, "progs/dog.mdl");
  371.         self.mdl = self.model;
  372.         self.oldorigin = self.origin;
  373.  
  374.     setsize (self, '-32 -32 -24', '32 32 40');
  375.     self.health = 25;
  376.  
  377.     self.th_stand = dog_stand1;
  378.     self.th_walk = dog_walk1;
  379.     self.th_run = dog_run1;
  380.     self.th_pain = dog_pain;
  381.     self.th_die = dog_die;
  382.         self.th_melee = dog_atta1;
  383.     self.th_missile = dog_leap1;
  384.  
  385.     walkmonster_start();
  386. };
  387.  
  388. void() dog_respawn =
  389. {
  390.         spawn_tfog(self.origin);
  391.         spawn_tfog(self.oldorigin);
  392.         spawn_tdeath(self.oldorigin, self);
  393.     setmodel (self, "progs/dog.mdl");
  394.     self.movetype = MOVETYPE_STEP;
  395.         self.solid = SOLID_SLIDEBOX;
  396.         self.health = 25;
  397.     setsize (self, '-32 -32 -24', '32 32 40');
  398.         setorigin (self, self.oldorigin);
  399.     self.th_stand = dog_stand1;
  400.     self.th_walk = dog_walk1;
  401.     self.th_run = dog_run1;
  402.     self.th_pain = dog_pain;
  403.     self.th_die = dog_die;
  404.     self.th_melee = dog_atta1;
  405.     self.th_missile = dog_leap1;
  406.         walkmonster_start();
  407. };  
  408.